package plgutils

import (
	"dgo/goutils/utils"
	"gitee.com/ymofen/gobase"
	"gitee.com/ymofen/supervalue"
	"strings"
)

func init() {
	utils.RegisterCreate("utils.app.ctrl", CreatePlgAppCtrlFunc)
	utils.RegisterCreate("utils.sync.map", CreatePlgSyncMapFunc)
	utils.RegisterCreate("utils.json.pack", CreateJsonPackPlgFunc)
	utils.RegisterCreate("utils.plug.maker.mix", CreateDbPlglMakerMixFunc)
	utils.RegisterCreate("utils.extract.list", CreatePlgExtractListFunc)
	utils.RegisterCreate("utils.objstorage", CreateObjStoragePlgFunc)
	utils.RegisterCreate("utils.objstorage.adapter", CreateObjStorageAdapterPlgFunc)
	utils.RegisterCreate("utils.obj.match", CreateObjMatchPlgFunc)
}

func NewSVArgs(useCache bool, args ...interface{}) (*wrapper.SuperValue, error) {
	if len(args) == 0 {
		return nil, nil
	}

	if json, ok := args[0].(*wrapper.SuperValue); ok {
		return json, nil
	} else if strMap, ok := args[0].(gobase.StrMap); ok {
		json := wrapper.NewSVObjectCache(useCache)
		json.CopyFromStrMap(strMap)
		return json, nil
	} else if strMap, ok := args[0].(*gobase.StrMap); ok {
		json := wrapper.NewSVObjectCache(useCache)
		json.CopyFromStrMap(*strMap)
		return json, nil
	} else if str, ok := args[0].(string); ok {
		if len(str) > 2 {
			if (str[0] == '{' && str[len(str)-1] == '}') || (str[0] == '[' && str[len(str)-1] == ']') {
				return wrapper.NewSVFromBufCache([]byte(str), useCache)
			}

			if strings.Index(str, "=") != -1 {
				json := wrapper.NewSVObject()
				json.CopyFromURLString(str)
				return json, nil
			}
		}
	} else if buf, ok := args[0].([]byte); ok {
		if len(buf) > 2 {
			if (buf[0] == '{' && buf[len(buf)-1] == '}') || (buf[0] == '[' && buf[len(buf)-1] == ']') {
				return wrapper.NewSVFromBufCache(buf, useCache)
			}
		}
	}

	return nil, nil
}
